package JZOffer;

// 表示数值的字符串
public class JzOffer20 {
    public static boolean isNumber(String s) {
        s = s.trim().toLowerCase();
        if (s.equals("") || s.charAt(s.length()-1) == 'e') {
            return false;
        }
        String[] strings = s.split("e");
        // 有 e 的情况
        if (strings.length > 2 || strings.length == 0) {
            return false;
        }
        if (strings.length == 2) {
            // 左边是空的
            if (strings[0].equals("")) {
                return false;
            } else if (!isInteger(strings[0])) {
                // e 左边不是一个整数或者一个小数
                if (!isDecimal(strings[0])) {
                    return false;
                }
            }
            // e 右边不是一个整数
            if (!isInteger(strings[1])) {
                return false;
            }
        }
        if (s.contains("e")) {
            return true;
        }
        // 没有 e 的情况
        if (s.contains(".")) {
            return isDecimal(s);
        } else {
            return isInteger(s);
        }
    }

    private static boolean isInteger(String s) {
        // 只有一个 + 或 - 的符号的情况
        if (s.length() == 1 && (s.equals("+") || s.equals("-")) || s.equals("")) {
            return false;
        }

        // 第一位不是 + 或 - 或者第一位 不是一个数字 的情况
        if (!Character.isDigit(s.charAt(0))) {
            if (s.charAt(0) != '+' && s.charAt(0) != '-') {
                return false;
            }
        }

        for (int i = 1; i < s.length(); i++) {
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != 'e') {
                return false;
            }
        }
        return true;
    }

    private static boolean isDecimal(String s) {
        // 多个小数点
        if (s.replaceFirst("\\.", "").contains(".")) {
            return false;
        }
        String[] strings = s.split("\\.");
        // 只有一个小数点
        if (strings.length == 0) {
            return false;
        }
        // 只存在小数点左边, 会切割成一个
        if (strings.length == 1) {
            if (!isInteger(strings[0])) {
                return false;
            }
        }

        if (strings.length == 2) {
            // 存在小数点右边
            for (int i = 0; i < strings[1].length(); i++) {
                if (!Character.isDigit(strings[1].charAt(i))) {
                    return false;
                }
            }

            // 左边是空或者是一个整数
            if (!strings[0].equals("")) {
                if (!strings[0].equals("+") && !strings[0].equals("-")) {
                    return isInteger(strings[0]);
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(isNumber("46.e2"));
    }
}
